Performance Optimization এর জন্য Lazy Loading এর গুরুত্ব

Java Technologies - স্প্রিং বুট জেপিএ (Spring Boot JPA) - Lazy এবং Eager Loading
353

Lazy Loading কী?

Lazy Loading হল একটি কৌশল যা JPA বা Hibernate-এ ব্যবহৃত হয়, যেখানে সম্পর্কিত অবজেক্টগুলিকে কেবল তখনই লোড করা হয় যখন সেগুলির আসল প্রয়োজন হয়। অর্থাৎ, যখন আপনি একটি অবজেক্ট লোড করেন, তখন তার সম্পর্কিত অবজেক্টগুলো স্বয়ংক্রিয়ভাবে লোড হয় না। সম্পর্কিত অবজেক্টগুলো lazy initialization এর মাধ্যমে পরবর্তীতে প্রয়োজনে লোড করা হয়।

Lazy loading স্প্রিং ডেটা জেপিএ (Spring Data JPA)-এ সম্পর্কিত (related) একাধিক টেবিলের ডেটা লোড করার সময় কার্যকরভাবে ব্যবহৃত হয় এবং এটি performance optimization এর জন্য একটি গুরুত্বপূর্ণ কৌশল।

Lazy Loading এর গুরুত্ব

Lazy loading ডেটাবেসের কর্মক্ষমতা উন্নত করতে সহায়তা করে, বিশেষ করে যখন আপনার একাধিক সম্পর্কিত টেবিল বা Entity থাকে এবং আপনি শুধুমাত্র প্রয়োজনীয় ডেটা লোড করতে চান। এর মাধ্যমে অবাঞ্ছিত ডেটা লোড হওয়ার সম্ভাবনা কমে যায় এবং অ্যাপ্লিকেশনের পারফরম্যান্স বাড়ে।

Lazy Loading এবং Eager Loading এর মধ্যে পার্থক্য

  • Lazy Loading: যখন সম্পর্কিত Entity/অবজেক্ট শুধুমাত্র তখনই লোড করা হয় যখন তা ব্যবহৃত হয়। এটি ডেটাবেসের অ্যাক্সেস কমাতে সাহায্য করে এবং প্রাথমিক লোডিংয়ের সময় দ্রুততর করে।
  • Eager Loading: সম্পর্কিত Entity/অবজেক্ট লোড হয় যখন মূল Entity লোড হয়, অর্থাৎ এটি ডেটাবেসের একাধিক টেবিলের ডেটা একসাথে লোড করে। এটি অতিরিক্ত লোড এবং পারফরম্যান্স সমস্যা তৈরি করতে পারে।

Lazy Loading ব্যবহারের উদাহরণ

ধরা যাক, আমাদের একটি User Entity এবং Address Entity রয়েছে, যেখানে একজন User এর একটি Address সম্পর্ক রয়েছে। আমরা Lazy Loading ব্যবহার করে Address অবজেক্ট লোড করব কেবল তখনই যখন তা প্রয়োজন হবে।

Step 1: User Entity ক্লাস তৈরি করা

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;

    @OneToOne(fetch = FetchType.LAZY)
    private Address address;  // Lazy Loading for Address Entity

    // Constructor, Getters, and Setters
    public User(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

এখানে, @OneToOne(fetch = FetchType.LAZY) অ্যানোটেশন ব্যবহার করা হয়েছে, যার মাধ্যমে User Entity এর address সম্পর্কটি Lazy Loading-এ লোড হবে।

Step 2: Address Entity ক্লাস তৈরি করা

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Address {

    @Id
    private Long id;
    
    private String city;
    private String street;

    // Constructor, Getters, and Setters
    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }
}

Step 3: UserRepository ইন্টারফেস তৈরি করা

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}

Step 4: Service ক্লাস তৈরি করা

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

Step 5: Controller ক্লাস তৈরি করা

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUserById(id);
    }
}

Lazy Loading এবং Performance Optimization

  • Initial Data Load: যখন User Entity লোড হয়, তখন Address Entity লোড হবে না। যদি address অ্যাক্সেস না করা হয়, তবে Address টেবিলের ডেটা লোড হবে না, যা পারফরম্যান্স অপ্টিমাইজেশন নিশ্চিত করে।
  • On-demand Loading: যখন address প্রপার্টি অ্যাক্সেস করা হবে, তখনই স্প্রিং ডেটা জেপিএ লেজি লোডিং কৌশল ব্যবহার করে ডেটা লোড করবে। এটি ডেটাবেস অ্যাক্সেসের সংখ্যা কমিয়ে অ্যাপ্লিকেশনকে দ্রুততর করে তোলে।

Lazy Loading এবং Eager Loading এর পার্থক্য

বৈশিষ্ট্যLazy LoadingEager Loading
লোডিং প্রক্রিয়াসম্পর্কিত Entity কেবল তখনই লোড হয় যখন প্রয়োজন হয়।সম্পর্কিত Entity মূল Entity এর সাথে একসাথে লোড হয়।
পারফরম্যান্সকম পারফরম্যান্স সমস্যা, কারণ প্রয়োজন ছাড়া ডেটা লোড হয় না।অতিরিক্ত ডেটা লোড হয়, যার কারণে পারফরম্যান্স কমতে পারে।
ব্যবহারছোট বা মাঝারি অ্যাপ্লিকেশন, যেখানে সম্পর্কিত ডেটা সব সময় প্রয়োজন নেই।বড় অ্যাপ্লিকেশন যেখানে সম্পর্কিত ডেটার সাথে কাজ করতে হয়।

সারাংশ

Lazy Loading একটি গুরুত্বপূর্ণ কৌশল যা ডেটাবেস অ্যাপ্লিকেশনে পারফরম্যান্স অপ্টিমাইজ করতে সহায়তা করে। এটি ডেটা লোড করার সময় শুধুমাত্র প্রয়োজনীয় ডেটা লোড করার মাধ্যমে অতিরিক্ত ডেটা লোড হওয়া থেকে রক্ষা করে। Spring Boot JPA-তে Lazy Loading ব্যবহার করলে আপনি নির্দিষ্ট সম্পর্কিত Entity গুলির লোডিং অপ্টিমাইজ করতে পারেন এবং ডেটাবেস অ্যাক্সেসের সংখ্যা কমাতে পারেন। এটি বিশেষভাবে বড় অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হলে ডেটাবেস লোড ও কনসালিডেশন কার্যক্রমে সাহায্য করে।


Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...